/**
 * getRandom - 获取某个范围内的随机整数的函数
 * @param {number} a 表示范围的数字
 * @param {number} b 表示范围的数字
 * @return {number} 返回范围内的随机数
 */
function getRandom(a, b){
    // var max = a;
    // var min = b;
    // if(a<b){
    //     max = b;
    //     min = a
    // }
    var max = Math.max(a, b)
    var min = Math.min(a, b)
    return parseInt(Math.random() * Math.abs(a-b)) + min
}
/**
 * getColor 获取随机颜色值的函数
 * @param {boolean} hex 是否要16进制的颜色值
 * @return {string} 返回的是颜色值
 */
function getColor(hex){
    // 判断是否需要16进制的颜色值 - hex是不是true
    if(hex === true){
        var color = '#';
        for(var i=0;i<3;i++){
            var num = getRandom(0,256)
            num = num.toString(16)
            num = num.length===1?'0'+num:num;
            color += num
        }
    }else{
        // var arr = []
        // for(var i=0;i<3;i++){
        //     var num = getRandom(0,256)
        //     arr.push(num)
        // }
        // var color = 'rgb(' + arr.join(',') + ')'

        var color = 'rgb(';
        var f = '';
        for(var i=0;i<3;i++){
            color += f + getRandom(0,256)
            f = ','
        }
        color += ')'
    }
    return color;
}
/**
 * getStyle 万能的获取样式的函数
 * @param {node} ele 要获取样式的标签对象
 * @param {string} attr 要获取的css的键
 * @return {string} 返回的是获取到的样式的值
 */
function getStyle(ele, attr){
    try{
        return getComputedStyle(ele)[attr]
    }catch(err){
        return ele.currentStyle[attr]
    }
}
/**
 * 兼容的事件侦听器
 * @param {node} ele 要绑定事件的标签元素
 * @param {string} type 事件类型
 * @param {function} handler 事件处理函数
 */
function bindEvent(ele, type, handler){
    if(ele.addEventListener){
        ele.addEventListener(type, handler)
    }else if(ele.attachEvent){
        ele.attachEvent("on"+type,handler)
    }
}
/**
 * 兼容的事件侦听器对应的解绑函数
 * @param {node} ele 要解绑事件的标签元素
 * @param {string} type 事件类型
 * @param {function} handler 事件处理函数
 */
function unBind(ele, type, handler){
    if(ele.removeEventListener){
        ele.removeEventListener(type, handler)
    }else if(ele.detachEvent){
        ele.detachEvent('on'+type, handler)
    }
}
/**
 * 批量设置样式的函数
 * @param {node} ele 要修饰样式的标签对象
 * @param {object} obj css键值对组成的对象
 */
function setStyle(ele, obj){
    for(var attr in obj){
        ele.style[attr] = obj[attr]
    }
}
/**
 * animate动画函数
 * @param {node} ele 要进行动画的元素
 * @param {object} obj 要进行动画的css键值对
 * @param {function} fn 所有动画结束后执行的函数
 */
function animate(ele, obj, fn=function(){}){
    let num = 0
    for(let attr in obj){
        num++
        let target = obj[attr]
        if(attr === 'opacity'){
            target *= 100
        }
        let currentStyle = getStyle(ele, attr)
        if(attr === 'opacity'){
            currentStyle *= 100
        }
        currentStyle = parseInt(currentStyle)
        let timerId = setInterval(function(){
            let speed = (target - currentStyle)/10
            speed = speed>0?Math.ceil(speed):Math.floor(speed)
            currentStyle += speed
            if(attr === 'opacity'){
                ele.style[attr] = currentStyle/100
            }else{
                ele.style[attr] = currentStyle + 'px'
            }
            if(currentStyle === target){
                clearInterval(timerId)
                num--
                if(num === 0){
                    fn()
                }
            }
        },20)
    }
}
/**
 * 发送ajax
 * @param {object} obj 
 */
function sendAjax(obj){
    if(obj.url === undefined){
        throw new Error('地址必填')
    }
    if(typeof obj.url !== 'string'){
        throw new Error('地址必须是字符串')
    }
    if(obj.method === undefined){
        obj.method = 'get'
    }
    if(obj.method.toLowerCase() !== 'get' && obj.method.toLowerCase() !== 'post'){
        throw new Error('请求方式必须是get或post')
    }
    if(obj.success === undefined){
        obj.success = function(){}
    }
    if(typeof obj.success !== 'function'){
        throw new Error('success必须是函数')
    }
    if(obj.data !== undefined){
        if(typeof obj.data === 'string'){
            var str = obj.data
        }else if(typeof obj.data === 'object'){
            var str = '';
            for(var attr in obj.data){
                str += '&' + attr + '=' + obj.data[attr]
            }
            str = str.slice(1)
        }else{
            throw new Error('数据必须是字符串或对象')
        }
        if(obj.method.toLowerCase() === 'get'){
            obj.url += '?' + str
        }
    }
    var xhr = new XMLHttpRequest;
    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4){
            if(xhr.status>=200 && xhr.status<300){
                res = xhr.responseText;
                obj.success(res)
            }
        }
    }
    xhr.open(obj.method, obj.url)
    if(obj.headers){
        for(var attr in obj.headers){
            xhr.setRequestHeader(attr, obj.headers[attr])
        }
    }
    if(obj.method.toLowerCase() === 'post' && obj.data){
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
        xhr.send(str)
        return
    }
    xhr.send()
}

function promiseAjax(obj){
    return new Promise(function(resolve, reject){
        if(obj.url === undefined){
            throw new Error('地址必填')
        }
        if(typeof obj.url !== 'string'){
            throw new Error('地址必须是字符串')
        }
        if(obj.method === undefined){
            obj.method = 'get'
        }
        if(obj.method.toLowerCase() !== 'get' && obj.method.toLowerCase() !== 'post'){
            throw new Error('请求方式必须是get或post')
        }
        if(obj.data !== undefined){
            if(typeof obj.data === 'string'){
                var str = obj.data
            }else if(typeof obj.data === 'object'){
                var str = '';
                for(var attr in obj.data){
                    str += '&' + attr + '=' + obj.data[attr]
                }
                str = str.slice(1)
            }else{
                throw new Error('数据必须是字符串或对象')
            }
            if(obj.method.toLowerCase() === 'get'){
                obj.url += '?' + str
            }
        }
        var xhr = new XMLHttpRequest;
        xhr.onreadystatechange = function(){
            if(xhr.readyState === 4){
                if(xhr.status>=200 && xhr.status<300){
                    res = xhr.responseText;
                    resolve(res)
                }else{
                    reject()
                }
            }
        }
        xhr.open(obj.method, obj.url)
        if(obj.headers){
            for(var attr in obj.headers){
                xhr.setRequestHeader(attr, obj.headers[attr])
            }
        }
        if(obj.method.toLowerCase() === 'post' && obj.data){
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
            xhr.send(str)
            return
        }
        xhr.send()
    })
}

